import json
from flask import Blueprint, jsonify, request
from views.goods import g_blue
from db import db # 导入数据库
from utils.myredis import r

index_blue=Blueprint('index_blue',__name__)


# 获取商家信息进行缓存
# 配置路由
@index_blue.route('/getshops')
def getshops():
    # 读取缓存，如果有直接转换成json字符串进行返回，没有查询数据库
    code='001'
    key="shop"+code   # 为了更好的分清楚id
    # r调用是调用sql数据库中的数据,获取缓存中的数据
    # 先取出
    shop=r.get_str(key)
    if not shop:
        # 并发访问的时候，只能一个人访问  ?????????????????
        res=r.setnx_str(key+'exit',key+'exit')
        if res:
            print('222')
            # 查询数据库中的所有数据  where 后是条件精准查询 第一
            sql = "select * from shops where code='001'"
            # shop 为结果
            shop = db.find(sql)
            # 把数据库中的数据放在这里进行缓存
            r.set_str(key,json.dumps(shop))
    else:
        # 否则将数据库中的数据转换为json字符串
        shop=json.loads(shop)
        print("shop:",shop)
    return jsonify({'code':200,'shops':shop})

# 获取所有分类接口
@index_blue.route("/getcates") # 默认采用get方法
def getcates():
    # 获取数据库中的cates字段
    # r.remove_str("cates")
    cates=r.get_str("cates")
    if not cates:
        sql="select id,name from category order by sort asc"
        res=db.find_all(sql) #获取排序后所有的数据
        data = [{'id': str(i['id']), 'text': i['name']} for i in res]
        r.set_str('cates',json.dumps(data))
    else:
        res=json.loads(cates)

    # if res:
    #     data=[{'id':i['id'],'name':i['name']} for i in res]
    return jsonify({
        'code':200,
        "catelist":res
    })








# 根据id获取分类下的所有数据
@index_blue.route("/idgetcates") # 默认采用get方法
def idgetcates():
    # 获取数据库中的cates字段
    cateid=request.args.get("cateid") # 获取分类的id
    # r.remove_str("goods" + cateid)
    goods=r.get_str('goods'+cateid) # 获取缓存中此分类下的商品
    if not goods:
        sql="select id,name,image,price,description from dish where category_id=%d and is_deleted=0"%(int(cateid))
        res=db.find_all(sql) #获取排序后所有的数据
        # 根据菜品id查询对应的菜品
        data=[]
        for i in res:
            dict = {'id': str(i['id']), 'name': i['name'], 'price': float(i['price']), 'image': i['image'],'description': i['description']}
            sql1="select value from dish_flavor where dish_id=%d"%(int(i['id']))
            flavors=db.find_all(sql1)
            flist=[]
            for j in flavors:
                flist.append(json.loads(j['value']))
            dict['flavors']=flist
            data.append(dict)
        # 加入缓存
        r.set_str('goods'+cateid,json.dumps(data))
    else:
        data=json.loads(goods)
    return jsonify({
        'code':200,
        "catelist":data
    })


# 添加到购物车接口
@index_blue.route('/addcart')
def addcart():
    # 获取参数userid gid count ['少糖','少盐']  type(1菜品 2套餐)
    userid=request.args.get('userid')
    gid=request.args.get('gid')
    count=request.args.get('count')
    type=request.args.get('type')
    flavors=request.args.get('flavors')

    r.del_hash('cart' + str(userid) + 'goods' + str(gid))
    # if not all in [userid,gid,count,type,flavors]:
    #     return jsonify({
    #         'code':400,
    #         'msg':'参数错误'
    #     })
    # 查询某个商品是否存在
    pkey='cart'+str(userid)+'goods'+str(gid)

    flag=r.is_exits(pkey)
    if int(flag)==0 :
        # 不存在添加
        r.hash_add(pkey,gid,count)
        r.hash_add(pkey,'type',type)
        r.hash_add(pkey,'flavors',json.dumps(flavors))
        # 把商品名称和价格以名字和price存入

    else:
        # 存在数量更新
        r.hash_hincrby(pkey,gid,count)
    # 返回结果
    return jsonify( {
        'code':200,
        'msg':'购买成功'
    })

# 模糊查询id
@index_blue.route('/mycart')
def mycart():

    # 获取userid
    userid=request.args.get('userid')
    print(userid)
    #根据userid模糊查询购物车的信息
    carts=r.findall_str('cart'+str(userid))
    print('carts:',carts)
    # 遍历购物车车，查每一个商品的属性
    clist=[]
    for i in carts:
        dict={}
        goods=r.hash_getall(i.decode())
        for k,v in goods.items():
            kk=k.decode()
            vv=v.decode()

            if kk=='type':
                dict['type']=vv
            elif kk=='flavors':
                dict['flavors']=json.loads(vv)
            else:
                dict['id']=kk
                dict['count']=vv
            print('dict',dict)
        clist.append(dict)
    if len(clist)>0:
        for i in clist:
            print('**',i['id'])
         # 根据id和类型查询名称和价格 1单品2套餐
            if i['type'] ==1:
                sql="select name,price from dish where id=%d"%(int(i['id']))

            else:
                sql="select name,price from dish where id=%d"%(int(i['id']))
            res=db.find(sql)
            print("***",res)
            # 重组
            i['name']=res['name']
            i['price']=float(res['price'])
        # 返回结果
        return jsonify({
                'code':200,
                'clist':clist
            })


# 购物车的根据id获取口味的值
@index_blue.route('/test')
def test():
    list1=[{
        'id':1397862477831122945,
        'name':'上汤焗龙虾',
        'price':12,
        'value':"['不辣','微辣','中辣']"
    },{
        'id':1397862477831122945,
        'name':'上汤焗龙虾',
        'price':12,
        'value':"['少盐','多盐']"
    },{
        'id':1397860578738352129,
        'name':'白切鸡',
        'price':12,
        'value':None
    },{
        'id':1397860792492666881,
        'name':'烤乳猪',
        'price':12,
        'value':None
    }]
    idlist=[]
    reslist=[]
    for i in list1:
        if i['id'] not in idlist:
            idlist.append(i['id'])
            vlist=[]
            # 如果列表中没有
            if i['value'] !=None:
               vlist=json.loads(i['value'])
            if i['id'] not in idlist:
                idlist.append(i['id'])
                reslist.append({"id":i['id'],'name':i['name'],'price':float(i['price']),'value':[vlist]})
            else:
                index=idlist.index(i['id'])
                reslist[index]['value'].append(vlist)
        return jsonify({
            'code':200,
            'msg':reslist
        })

























